package com.lgy.ms.core.utils;

//import com.light.util.other.GeneralHelper;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class DateHelper {
    private DateHelper() {
    }

    public static DateHelper instance = new DateHelper();

    static {
        TimeZone time = TimeZone.getTimeZone("GMT+8");
        //设置为东八区
        time = TimeZone.getDefault();
        // 这个是国际化所用的
        TimeZone.setDefault(time);
    }

    public static Date getCurrentDate() {
        return Calendar.getInstance().getTime();
    }

    public static String getCurrentDateStr(String pattern) {
        return date2Str(getCurrentDate(), pattern);
    }
    public static final String date2Str(Date date, String format) {
        DateFormat df = new SimpleDateFormat(format);
        return df.format(date);
    }

    /**
     * 转换字符串类型的日期 的格式,
     *
     * @param dateStr
     * @param fromPattern 原始 格式
     * @param toPattern   要转换的格式
     * @return
     */
//    public static String changeDatePattern(String dateStr, String fromPattern, String toPattern) {
//        SimpleDateFormat sdf = new SimpleDateFormat(fromPattern);
//        Date d = null;
//        try {
//            d = sdf.parse(dateStr);
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//        return GeneralHelper.date2Str(d, toPattern);
//    }

    /**
     * 将日期格式如20140101转换成带-的日期格式
     *
     * @param dateStr
     * @return
     */
    public static String convertToStrDate(String dateStr) {
        String retDate = null;
        if (dateStr == null) return retDate;
        retDate = dateStr.replaceAll("0{6}", "");
        if (retDate.equals(dateStr)) {
            retDate = dateStr.replaceAll("0{2}", "");
        }
        try {
            if (retDate.length() == 14) {
                retDate = retDate.replaceAll("(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})", "$1-$2-$3 $4:$5:$6");
            } else if (retDate.length() == 8) {
                retDate = retDate.replaceAll("(\\d{4})(\\d{2})(\\d{2})", "$1-$2-$3");
            } else {
                retDate = retDate.replaceAll("(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})", "$1-$2-$3 $4:$5");
            }
        } catch (Exception e) {
            retDate = dateStr;
        }
        return retDate;
    }

    /**
     * 获取上一天
     *
     * @param pattern
     * @return
     */
//    public static String getLastDateStr(String pattern) {
//        Date date = new Date();
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(date);
//        calendar.add(Calendar.DAY_OF_MONTH, -1);
//        date = calendar.getTime();
//        return GeneralHelper.date2Str(date, pattern);
//    }


    /**
     * 获取指定日期上一天 传入与传出格式
     *
     * @param beginDate
     * @param pattern   传入与传出日期格式 同一个
     * @return
     */
//    public static String getLastDateStr(String beginDate, String pattern) {
//        Date date = new Date();
//        DateFormat format = new SimpleDateFormat(pattern);
//        try {
//            date = format.parse(beginDate);
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(date);
//        calendar.add(Calendar.DAY_OF_MONTH, -1);
//        date = calendar.getTime();
//        return GeneralHelper.date2Str(date, pattern);
//    }

    /**
     * 获取指定日期后一天 传入与传出格式
     *
     * @param beginDate
     * @param pattern   传入与传出日期格式 同一个
     * @return
     */
//    public static String getTomorrowDateStr(String beginDate, String pattern) {
//        Date date = new Date();
//        DateFormat format = new SimpleDateFormat(pattern);
//        try {
//            date = format.parse(beginDate);
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(date);
//        calendar.add(Calendar.DAY_OF_MONTH, +1);
//        date = calendar.getTime();
//        return GeneralHelper.date2Str(date, pattern);
//    }

    /**
     * 获取指定日期 相差天数 的日期, 传入与传出格式
     *
     * @param beginDate
     * @param pattern   传入与传出日期格式 同一个
     * @param num       与指定日期相差天数 ,正数 表示 往后 数, 负数 表示 往前 数
     * @return
     */
//    public static String getAddOrSubDateStr(String beginDate, String pattern, int num) {
//        Date date = new Date();
//        DateFormat format = new SimpleDateFormat(pattern);
//        try {
//            date = format.parse(beginDate);
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(date);
//        calendar.add(Calendar.DAY_OF_MONTH, num);
//        date = calendar.getTime();
//        return GeneralHelper.date2Str(date, pattern);
//    }

    /**
     * 返回一段日期的每个值的集合;(如:20150802到20151010这个日期段的每一天,包含起止日期)
     *
     * @param beginDate
     * @param endDate
     * @param pattern
     * @return
     */
    public static List<String> fromBeginToEndDate(String beginDate, String endDate, String pattern) throws ParseException {

        List<String> dates = new ArrayList<String>();
        Date d1 = new SimpleDateFormat(pattern).parse(beginDate);//定义起始日期
        Date d2 = new SimpleDateFormat(pattern).parse(endDate);//定义结束日期
        Calendar c = Calendar.getInstance();//定义日期实例
        c.setTime(d1);//设置日期起始时间
        while (c.getTime().before(d2)) {//判断是否到结束日期
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            String str = sdf.format(c.getTime());
            c.add(Calendar.DAY_OF_MONTH, 1);//进行当前日期天数加1
            dates.add(str);
        }
        String lastDay = new SimpleDateFormat(pattern).format(c.getTime());
        dates.add(lastDay);
        return dates;
    }

    /**
     * 返回开始时间和结束时间之间的天数（包括起止时间）
     *
     * @param beginDate
     * @param endDate
     * @param pattern
     * @return
     */
    public static int daysBetween(String beginDate, String endDate, String pattern) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(beginDate));
        long time1 = cal.getTimeInMillis();
        cal.setTime(sdf.parse(endDate));
        long time2 = cal.getTimeInMillis();
        long between_days = (time2 - time1) / (1000 * 3600 * 24);
        int num = Integer.parseInt(String.valueOf(between_days)) + 1;
        return num;
    }

    /**
     * 返回开始时间和结束时间之间的秒数（包括起止时间）
     *
     * @param beginDate
     * @param endDate
     * @param pattern
     * @return
     */
    public static int secondsBetween(String beginDate, String endDate, String pattern) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(beginDate));
        long time1 = cal.getTimeInMillis();
        cal.setTime(sdf.parse(endDate));
        long time2 = cal.getTimeInMillis();
        long between_seconds = (time2 - time1) / 1000;
        int num = Integer.parseInt(String.valueOf(between_seconds)) + 1;
        return num;
    }

    /**
     * 获取指定日期 相差月数 的日期, 传入与传出格式
     *
     * @param beginDate
     * @param pattern   传入与传出日期格式 同一个
     * @param num       与指定日期相差月数 ,正数 表示 往后 数, 负数 表示 往前 数
     * @return
     */
//    public static String getMonthDateStr(String beginDate, String pattern, int num) {
//        Date date = new Date();
//        DateFormat format = new SimpleDateFormat(pattern);
//        try {
//            date = format.parse(beginDate);
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(date);
//        calendar.add(Calendar.MONTH, num);
//        date = calendar.getTime();
//        return GeneralHelper.date2Str(date, pattern);
//    }
}
